iT邦幫忙

2024 iThome 鐵人賽

DAY 3
0
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 3

Day3- 容器與他們的產地 fantastic containers and where to find them- 上

  • 分享至 

  • xImage
  •  

🐳 K8s作為容器的管理平台,並不直接操作容器,多層Objects各司其職,這樣設計的用意在於能提供額外的資訊,確保服務運作,而不是單純讓某個容器運行而已,資訊像是有重啟的規則(restart policy)或是執行存活性檢測(liveness)等,接下來將由內層向外介紹~

正式部署服務時,架構大致分有三層: Deployment, ReplicaSet, Pod

  1. Deployment: 維護服務可用性,層層分配工作
  2. ReplicaSet: 負責管理數量,產生或移除Pod
  3. Pod: 管理Container本體,存在性相對不穩定的物件

https://ithelp.ithome.com.tw/upload/images/20240807/20168178E5kGQiwaE2.png

部署的最小單位: Pod

Pod為部署的最小單位,官方文件形容Pod像是一群鯨魚(a pod of whale) 或是豌豆(pea pod),為容器(們)的集合單位,除了有服務的容器本身,還能結合輔助性功能的容器,從設計架構來看,能得知在流程上會是先有Pod,再產生容器於其中

Pod規範了如何執行容器,同Pod當中的容器之間共享資源、排程及上下文(context)等,上下文包含Linux namespace, cgroup等其它面向的隔離,在容器本身也會有此類的隔離設定

🏷️ 兩種pod的設計方式

  1. 單容器: 常見方式,單包裝
  2. 多容器(進階使用方法): 包裝多個container,這些容器高度密切合作,因此可以看成是一個單位

Pod的檔案

# Pod的api-version
apiVersion: v1
# 指定Object類型
kind: Pod
# Pod名稱,namespace不指定則為default
metadata:
  name: nginx
  namespace: default
# 內裝的container規格書 (僅展示部分)
spec:
  containers: # 一個container設定一組list
  - name: nginx-1
    image: nginx:1.14.2
    ports:
    - containerPort: 80
  - name: nginx-2
    image: nginx:1.14.2
    ports:
    - containerPort: 81  

👉 通常不會直接建立Pod,Pod被設計為相對短暫(ephemeral)且可棄用的Object,在執行完畢、缺少資源或節點壞掉時就會移除,因此由其它Object代管Pod的生滅,在實際情況下更有擴充彈性及可用性

Pod的操作指令

# 建立pod, 指定image, port
# --dry-run=client -o yaml 不實際執行, 結果匯出為yaml
kubectl run nginx --image=nginx:1.14.2 --port=80 --dry-run=client -o yaml
# 建立pod(imeparative), 預設annotation不包含編輯紀錄, 補上紀錄 --save-config
kubectl create -f <檔案名稱>
# 建立pod(declarative)
kubectl apply -f <檔案名稱>
# 查看全部pod
# 全部namespace: -A, --all-namespaces
# 特定namespace: --namespace <名稱>
kubectl get pod 
kubectl get po
kubectl get pods <optional:名稱>
# 查看特定pod詳細
kubectl describe pod <optional:名稱>
# 編輯pod: 更新既存的Pod,進入vim頁面編輯欄位/值,需注意此方式不會同步更新最初建立pod的yaml文件,並且只能更新部分屬性
# spec.containers[*].image
# spec.initContainers[*].image
# spec.activeDeadlineSeconds
# spec.tolerations
kubectl edit pod <xxx>
# 刪除pod
kubectl delete pod <xxx>

副本數量管理: ReplicaSet

負責管理Pod數量及其生滅,原本為Replication Controller(apiVersion: v1),目前改為ReplicaSet (apiVersion: app/v1),依照selector標定要管理的Pod是誰,新版API指定selector為必要設定,管理的Pod可能非ReplicaSet所建立(領養?),功能為提供:

  • 確保Pod數量,像是在既有Pod失效時,能有新Pod生成接手
  • 負載平衡
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rc
  labels: # replicaset本身的標籤
    app: myapp
    type: front-end
spec:
  template: # 模板內容就是pod的metadata和spec部分
    metadata:
      name: myapp-pod
      labels: # pod的標籤
        app: myapp
        type: front-end
    spec:
      containers:
        - name: nginx-container
          image: nginx

  replicas: 3
  selector:
    matchLabels: # 和replicaset的label做媒合
      type: front-end 

ReplicaSet的操作指令

# 取得ReplicaController: 
kubectl get replicacontroller
# 建立replicaset
kubectl create -f <檔案名稱>
# 取得ReplicaSet
kubectl get replicaset
kubectl get rs
# 查看replicaset 說明 | 取出版本的部分
kubectl explain replicaset | grep VERSION
# 移除replicaset
kubectl delete rs <...名稱>
# 更新replicaset
# - 直接編輯
kubectl edit replicaset/new-replica-set
# - 透過檔案
kubectl replace -f replicasetreplicaset-definition.yml
# - 命令擴展
kubectl scale --replicas=x replicaset <名稱>

不熟object的時候,能直接查看說明,挺方便的
不熟object的時候,能直接查看說明,挺方便的

下篇待續...


上一篇
Day2: Kubernetes與小夥伴們的溝通之道
下一篇
Day4. 容器與他們的產地 Fantastic containers and where to find them- 下
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言